/**
 * 调试帮助工具
 */

import { SSEConnectionStatus } from '../api/sseChat';

/**
 * 检查浏览器是否支持 SSE
 * @returns 是否支持 SSE
 */
export function checkSSESupport(): boolean {
  return 'EventSource' in window;
}

/**
 * 检查 SSE 连接状态
 * @param url SSE 服务器 URL
 * @returns 连接检查结果
 */
export interface SSEConnectionCheckResult {
  corsEnabled: boolean;
  corsErrorMessage?: string;
  connectionSuccess: boolean;
  connectionErrorMessage?: string;
}

/**
 * 检查 SSE 连接状态
 * @param url SSE 服务器 URL
 * @returns 连接检查结果
 */
export async function checkSSEConnection(url: string): Promise<SSEConnectionCheckResult> {
  const result: SSEConnectionCheckResult = {
    corsEnabled: false,
    connectionSuccess: false
  };

  // 首先检查 CORS
  try {
    const response = await fetch(url, {
      method: 'OPTIONS',
      headers: {
        'Accept': 'text/event-stream',
        'Content-Type': 'application/json'
      }
    });

    // 检查 CORS 响应头
    result.corsEnabled = response.headers.get('Access-Control-Allow-Origin') !== null;
    
    if (!result.corsEnabled) {
      result.corsErrorMessage = 'CORS 响应头缺失: Access-Control-Allow-Origin';
    }
  } catch (error) {
    result.corsEnabled = false;
    result.corsErrorMessage = error instanceof Error ? error.message : '未知 CORS 错误';
  }

  // 尝试建立连接 - 使用 POST 请求而不是 EventSource
  try {
    // 创建一个简单的测试消息
    const testMessage = {
      request_id: 'test-connection-' + Date.now(),
      content: 'test connection',
      session_id: 'test-session-' + Date.now(),
      visitor_biz_id: 'test-visitor-' + Date.now(),
      bot_app_key: import.meta.env.VITE_BOT_BIZ_ID || 'tHIucAjz'
    };

    console.log('测试连接参数:', testMessage);

    // 创建超时控制
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), 10000);

    // 发送 POST 请求
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
      },
      body: JSON.stringify(testMessage),
      credentials: 'include',
      signal: controller.signal
    });

    clearTimeout(timeoutId);

    console.log('连接检查响应:', {
      status: response.status,
      statusText: response.statusText,
      headers: Object.fromEntries([...response.headers.entries()])
    });

    if (!response.ok) {
      const errorText = await response.text().catch(() => '无法读取错误详情');
      throw new Error(`HTTP错误! 状态: ${response.status} - ${response.statusText}, 详情: ${errorText}`);
    }

    // 尝试读取一些数据确认连接正常
    const reader = response.body?.getReader();
    if (reader) {
      try {
        const { value, done } = await reader.read();
        
        // 如果读取到数据，尝试解码并记录
        if (value && !done) {
          const decoder = new TextDecoder();
          const data = decoder.decode(value);
          console.log('收到SSE数据:', data);
          result.connectionSuccess = true;
        } else if (done) {
          throw new Error('连接建立后立即关闭');
        } else {
          result.connectionSuccess = true; // 连接成功但没有数据
        }
      } finally {
        reader.cancel().catch(console.error);
      }
    } else {
      throw new Error('无法获取响应流');
    }

  } catch (error) {
    result.connectionSuccess = false;
    
    if (error instanceof DOMException && error.name === 'AbortError') {
      result.connectionErrorMessage = '连接超时 (10秒)';
    } else {
      result.connectionErrorMessage = error instanceof Error ? error.message : '未知连接错误';
    }
    
    console.error('SSE连接测试失败:', error);
  }

  return result;
}

/**
 * 记录详细错误信息
 * @param error 错误对象
 * @param context 上下文信息
 * @returns 格式化的错误信息
 */
export function logDetailedError(error: unknown, context: string = ''): string {
  let errorMessage = '未知错误';
  let errorSource = '';
  
  if (error instanceof Error) {
    errorMessage = error.message;
    errorSource = error.stack ? `\n堆栈: ${error.stack}` : '';
  } else if (error instanceof Event) {
    errorMessage = 'Event错误';
    errorSource = `\n类型: ${error.type}`;
  } else if (typeof error === 'string') {
    errorMessage = error;
  } else {
    try {
      errorMessage = JSON.stringify(error);
    } catch {
      errorMessage = String(error);
    }
  }
  
  const contextInfo = context ? `[${context}] ` : '';
  const fullErrorMessage = `${contextInfo}${errorMessage}${errorSource}`;
  
  // 记录到控制台
  console.error(fullErrorMessage);
  
  return fullErrorMessage;
}

/**
 * 调试模式
 */
export const DEBUG_MODE = import.meta.env.MODE === 'development';

/**
 * 条件日志（仅在调试模式下输出）
 * @param message 日志消息
 * @param data 日志数据
 */
export function debugLog(message: string, data?: any): void {
  if (import.meta.env.DEV) {
    if (data) {
      console.log(`[Debug] ${message}`, data);
    } else {
      console.log(`[Debug] ${message}`);
    }
  }
} 